package com.mk.es.service.repertory;

import com.mk.es.service.entity.AbstractEsEntry;
import com.mk.es.service.transport.entity.EsQueryBuilder;
import com.mk.es.service.entity.EsQueryParam;
import com.mk.es.service.transport.entity.EsQueryResult;
import com.mk.es.service.transport.handler.EsSearchResponseHandler;

import java.util.Map;

/**
 * ES 的仓库 接口类
 */
public interface InterfaceEsRepertory<T extends AbstractEsEntry>  {

    /**
     * 初始化方法
     */
    void init();

    /**
     * 添加索引类型Mapping
     * @param mapping
     * @return
     */
    boolean putMapping(String mapping);

    /**
     * 添加索引类型Mapping
     * @return
     */
    boolean putMapping();

    /**
     * 添加文档
     * @param object
     * @return
     */
    void addOrUpdateDocument(T object);

    /**
     * 更新文档
     * @param object
     * @return
     */
    public void updateDocument(T object);

    /**
     * 更新部分文档
     * @param map
     * @return
     */
    public void updateDocumentPartInfo(String id, Map<String, Object> map);

    /**
     * 删除文档
     * @param id
     * @return
     */
    boolean delDocument(String id);

    /**
     * 获取文档信息
     * @param id
     * @return
     */
    T getDocument(String id);

    /**
     * 查询对应的类
     * @param queryJsonStr
     * @param params
     * @param <T>
     * @return
     */
    <T> EsQueryResult<T> querySearch(String queryJsonStr, Map<String, Object> params);

    /**
     * ES 查询
     * @param queryJsonStr 查询语句
     * @param params 查询参数
     * @param handlerAdapter 查询处理类
     * @param <T>
     * @return
     */
    <T> EsQueryResult<T> querySearch(String queryJsonStr, Map<String, Object> params, EsSearchResponseHandler<T> handlerAdapter);

    /**
     * ES 查询
     * @param esQueryBuilder 查询
     * @param <T>
     * @return
     */
    <T> EsQueryResult<T> querySearch(EsQueryBuilder esQueryBuilder);

    /**
     * ES 查询
     * @param esQueryBuilder 查询
     * @param <T>
     * @return
     */
    <T> EsQueryResult<T> querySearch(EsQueryBuilder esQueryBuilder, EsSearchResponseHandler<T> handlerAdapter);

    /**
     * ES 查询
     * @param param 查询参数
     * @param <T>
     * @return
     */
    <T> EsQueryResult<T> querySearch(EsQueryParam param);
}
